//  speech_server的测试客户端实现
//  1. 进行服务发现--发现speech_server的服务器节点地址信息并实例化的通信信道
//  2. 读取语音文件数据
//  3. 发起语音识别RPC调用

#include "aip-cpp-sdk/speech.h"
#include "etcd.hpp"
#include "channel.hpp"
#include <gflags/gflags.h>
#include <thread>
#include "speech.pb.h"

DEFINE_bool(run_mode, false, "程序的运行模式, false-调试模式, true-发布模式");
DEFINE_string(log_file, "", "发布模式下, 用于指定日志文件的路径");
DEFINE_int32(log_level, 0, "发布模式下, 用于指定日志的输出等级");

DEFINE_string(etcd_host, "http://127.0.0.1:2379", "这是服务注册中心的地址");
DEFINE_string(base_service, "/service", "这是服务监控根目录");
DEFINE_string(speech_service, "/service/speech_service", "这是服务监控根目录");

void online(const std::string &service_name, const std::string &service_host)
{
    LOG_DEBUG("服务{}上线, 主机信息: {}", service_name, service_host);
}

void offline(const std::string &service_name, const std::string &service_host)
{
    LOG_DEBUG("服务{}下线, 主机信息: {}", service_name, service_host);
}

int main(int argc, char *argv[])
{
    google::ParseCommandLineFlags(&argc, &argv, true);
    suye::Init_logger(FLAGS_run_mode, FLAGS_log_file, FLAGS_log_level);

    // 1.先构造RPC信道管理对象
    auto service_manager = std::make_shared<suye::ServiceManager>();
    service_manager->Declared(FLAGS_speech_service);
    auto put_cb = std::bind(&suye::ServiceManager::OnServiceOnline, service_manager.get(), std::placeholders::_1, std::placeholders::_2);
    auto del_cb = std::bind(&suye::ServiceManager::OnServiceOffline, service_manager.get(), std::placeholders::_1, std::placeholders::_2);

    // 2.构造服务发现对象
    suye::Discovery::ptr dclient = std::make_shared<suye::Discovery>(FLAGS_etcd_host, FLAGS_base_service, put_cb, del_cb);

    // 3.通过RPC信道管理对象, 获取提供speech服务的服务实例列表
    auto channel = service_manager->Choose(FLAGS_speech_service);
    if (!channel)
    {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        return -1;
    }

    // 读取语音文件数据
    std::string file_content;
    aip::get_file_content("16k.pcm", &file_content);
    std::cout << file_content.size() << std::endl;

    // 4.发起speech服务的RPC调用
    suye::SpeechService_Stub stub(channel.get());
    suye::SpeechRecognitionReq request;
    request.set_speech_content(file_content);
    request.set_request_id("111111");

    brpc::Controller* cntl = new brpc::Controller();
    suye::SpeechRecognitionRsp* response = new suye::SpeechRecognitionRsp();
    stub.SpeechRecognition(cntl, &request, response, nullptr);
    if (cntl->Failed() == true)
    {
        std::cout << "Rpc调用失败: " << cntl->ErrorText() << std::endl;
        delete cntl;
        delete response;
        std::this_thread::sleep_for(std::chrono::seconds(1)); 
        return -1;
    }
    if (response->success() == false)
    {
        std::cout << response->errmsg() << std::endl;
        return -1;
    }
    std::cout << "收到响应: " << response->request_id() << std::endl;
    std::cout << "收到响应: " << response->recognition_result() << std::endl;

    return 0;
}